<!--
  费率配置：

  @author terrfly
  @site https://www.jeequan.com
  @date 2022/04/06 10:14
-->

<!--

   费率配置面板，  支持9种模式： 

  ( mgrIsv ) 运营平台对服务商的配置：  查询【服务商所有支持的支付方式】
  支付产品 、 [配置]服务商底价、  [配置]代理商默认费率、  [配置]商户默认费率。 

  ( mgrAgent ) 运营平台对代理商的费率配置： 查询： 【代理的所属服务商 、 所属上级代理商的所有开通的支付产品】 
  支付产品、 [显示]服务商底价， [显示]上级代理商费率、  [配置]代理商的费率、  [配置]下级代理商的默认费率、  [配置]商户默认费率。 

  ( mgrMch ) 运营平台对商户：  查询【商户的所属服务商 、 所属上级代理商的所有开通的支付产品】
  支付产品、 [显示]服务商底价， [显示]上级代理商费率、  [配置]商户的费率。 

  ( agentSelf ) 代理商 对自己：   查询【当前代理商已经开通的产品】
  支付产品、 [显示]当前代理商的费率、  [配置]下级代理商的默认费率、  [配置]商户默认费率。

  ( agentSubagent ) 代理商对下级代理商：  查询【当前代理商已经开通的产品】
  支付产品、 [显示]当前代理商的费率、  [配置]下级代理商的费率

  ( agentMch ) 代理商对商户： 查询【当前代理商已经开通的产品】
  支付产品、 [显示]上级代理商费率、  [配置]商户的费率。 


  ( mgrApplyment ) 显示方式同： mgrMch。  只是不需要 切换支付接口和保存按钮    新增按钮： 查询默认费率。 

  ( agentApplyment ) 显示方式同： agentMch  只是不需要 切换支付接口和保存按钮.   新增按钮： 查询默认费率。 

  ( mchApplyment ) 不需要 切换支付接口和保存按钮.   显示的就是代理商或者服务商配置的默认费率。 
  -->

<template>
  <!-- 微信 -->
  <JeepayHeaderTitle
    title="微信产品费率"
    @conflateBut="vdata.weChatSplitFlag = false"
    @splitBut="vdata.weChatSplitFlag = true"
  >
    <template #right>
      <a-checkbox-group
        v-if="!vdata.weChatSplitFlag"
        v-model:value="weChatArray"
        :options="weChatArray"
        disabled
        style="margin-right: 30px"
      />
    </template>
  </JeepayHeaderTitle>
  <JeepayRateCard v-if="!vdata.weChatSplitFlag">
    <div class="weChat-pay-list">
      <div class="w-pay-item">
        <div class="w-pay-title">服务商低价：</div>
        <JeepayInputOrReadOnly v-model:value="vdata.test" after="%" />
      </div>
      <div class="w-pay-item">
        <div class="w-pay-title">子代理默认费率：</div>
        <a-input>
          <template #addonAfter> %</template>
        </a-input>
      </div>
      <div class="w-pay-item">
        <div class="w-pay-title">子商户默认费率：</div>
        <a-input>
          <template #addonAfter> %</template>
        </a-input>
      </div>
    </div>
  </JeepayRateCard>
  <template v-if="vdata.weChatSplitFlag">
    <JeepayRateCard v-for="(v, i) in weChatArray" :key="i" :title="v" isSplit>
      <template #headerLeft>
        <a-checkbox style="margin-left: 30px" />
      </template>
      <div class="weChat-pay-list">
        <div class="w-pay-item">
          <div class="w-pay-title">服务商底价：</div>
          <div>单笔：0.12%</div>
        </div>
        <div class="w-pay-item">
          <div class="w-pay-title">上级代理商费率：</div>
          <div>单笔：0.2%</div>
        </div>
        <div class="w-pay-item">
          <div class="w-pay-title">当前代理商费率：</div>
          <a-input>
            <template #addonAfter> %</template>
          </a-input>
        </div>
      </div>
    </JeepayRateCard>
  </template>
  <!-- 支付宝 -->
  <JeepayHeaderTitle
    title="支付宝产品费率"
    @conflateBut="vdata.aliSplitFlag = false"
    @splitBut="vdata.aliSplitFlag = true"
  >
    <template #right>
      <a-checkbox-group v-model:value="aliPayArray" :options="aliPayArray" disabled style="margin-right: 30px" />
    </template>
  </JeepayHeaderTitle>
  <JeepayRateCard v-if="!vdata.aliSplitFlag" isHigh>
    <template>
      <div class="weChat-pay-list">
        <div class="w-pay-item">
          <div class="w-pay-title">服务商低价：</div>
          <JeepayInputOrReadOnly after="%" />
        </div>
        <div class="w-pay-item">
          <div class="w-pay-title">子代理默认费率：</div>
          <JeepayInputOrReadOnly after="%" />
        </div>
        <div class="w-pay-item">
          <div class="w-pay-title">子商户默认费率：</div>
          <JeepayInputOrReadOnly after="%" />
        </div>
      </div>
    </template>
    <JeepayRateLadder />
    <template #highConfig>
      <JeepayRateLadder type="highConfig" />
    </template>
  </JeepayRateCard>
  <template v-if="vdata.aliSplitFlag">
    <JeepayRateCard v-for="(v, i) in aliPayArray" :key="i" :title="v" isSplit>
      <template #headerLeft>
        <a-checkbox style="margin-left: 30px" />
      </template>
      <div class="weChat-pay-list">
        <div class="w-pay-item">
          <div class="w-pay-title">服务商底价：</div>
          <div>单笔：0.12%</div>
        </div>
        <div class="w-pay-item">
          <div class="w-pay-title">上级代理商费率：</div>
          <div>单笔：0.2%</div>
        </div>
        <div class="w-pay-item">
          <div class="w-pay-title">当前代理商费率：</div>
          <a-input>
            <template #addonAfter> %</template>
          </a-input>
        </div>
      </div>
    </JeepayRateCard>
  </template>
  <JeepayHeaderTitle title="银联产品费率" @conflateBut="vdata.aliSplitFlag = false" @splitBut="vdata.aliSplitFlag = true">
    <template #right>
      <a-checkbox-group v-model:value="vdata.unPaySelected" :options="vdata.UnionPayArray" style="margin-right: 30px" />
    </template>
  </JeepayHeaderTitle>
  <JeepayRateCard isHigh>
    <div class="unPay-title-list">
      <div class="unPay-title-item">类型：</div>
      <div class="unPay-title-item">服务商底价：</div>
      <div class="unPay-title-item">子代理默认费率：</div>
      <div class="unPay-title-item">子商户默认费率：</div>
    </div>
    <div class="unPay-input-list">
      <div class="unPay-input-item">借记卡（储蓄卡）：</div>
      <div class="unPay-input-item">
        <JeepayInputOrReadOnly after="%" before="交易金额 <= 1000元：" type="readOnly" />
        <JeepayInputOrReadOnly after="%" before="交易金额 >&nbsp&nbsp 1000元：" />
      </div>
      <div class="unPay-input-item">
        <JeepayInputOrReadOnly after="%" before="交易金额 <= 1000元：" />
        <JeepayInputOrReadOnly after="%" before="交易金额 >&nbsp&nbsp 1000元：" />
      </div>
      <div class="unPay-input-item">
        <JeepayInputOrReadOnly after="%" before="交易金额 <= 1000元：" />
        <JeepayInputOrReadOnly after="%" before="交易金额 >&nbsp&nbsp  1000元：" />
      </div>
    </div>
    <div class="unPay-input-list">
      <div class="unPay-input-item">贷记卡（信用卡）：</div>
      <div class="unPay-input-item">
        <JeepayInputOrReadOnly after="%" before="交易金额 <= 1000元：" />
        <JeepayInputOrReadOnly after="%" before="交易金额 >&nbsp&nbsp 1000元：" />
      </div>
      <div class="unPay-input-item">
        <JeepayInputOrReadOnly after="%" before="交易金额 <= 1000元：" />
        <JeepayInputOrReadOnly after="%" before="交易金额 >&nbsp&nbsp 1000元：" />
      </div>
      <div class="unPay-input-item">
        <JeepayInputOrReadOnly after="%" before="交易金额 <= 1000元：" />
        <JeepayInputOrReadOnly after="%" before="交易金额 >&nbsp&nbsp 1000元：" />
      </div>
    </div>
    <template #highConfig>
      <JeepayRateLadder type="UnionPay" />
    </template>
  </JeepayRateCard>
  <div class="save-but-wrapper">
    <div class="save-but-item">
      <a-button block type="primary" @click="save">保存配置</a-button>
    </div>
  </div>
</template>

<script lang="ts" setup>
import {$getRateConfigPayways, $getRateConfigSavedMapData, $saveRateConfig} from '@/api/manage'
import {defineExpose, getCurrentInstance, onMounted, reactive} from 'vue'
import JeepayHeaderTitle from './JeepayHeaderTitle.vue'
import JeepayRateCard from './JeepayRateCard.vue'
import JeepayRateLadder from './JeepayRateLadder.vue'
import JeepayInputOrReadOnly from './JeepayInputOrReadOnly.vue'

const {$infoBox, $hasAgentEnt} = getCurrentInstance()!.appContext.config.globalProperties
// 定义父组件的传值b
const props: any = defineProps({
  infoId: {type: String, default: ''}, // 当前配置的所属infoId
  configMode: {type: String, default: ''}, // 模式
  selectIfCode: {type: String, default: ''}, // 默认选中的支付接口
  onlyRate: {type: Boolean, default: false}, // 是否只有费率的模式， true: 只显示费率（一般进件模式选择该方式, 并且配合selectIfCode使用），  false 显示支付接口和保存按钮。
  showSaveBtn: {type: Boolean, default: true}, // 是否显示保存按钮， 当向三方申请保存费率申请时，不需要显示。
})
const weChatArray = ['微信小程序', '微信公众号', '微信条码']
const aliPayArray = ['支付宝二维码', '支付宝小程序', '支付宝生活号', '支付宝条码']

function getShowName(mapName) {
  // 运营平台： 服务商的配置费率模式
  if (props.configMode == 'mgrIsv') {
    if (mapName == 'mainRateMap') return '服务商底价'
    if (mapName == 'agentdefMap' && $hasAgentEnt()) return '代理商默认费率'
    if (mapName == 'mchapplydefMap') return '商户进件默认费率'
  }

  if (props.configMode == 'mgrAgent') {
    if (mapName == 'mainRateMap') return '当前代理商费率'
    if (mapName == 'agentdefMap' && $hasAgentEnt()) return '下级代理商默认费率'
    if (mapName == 'mchapplydefMap' && $hasAgentEnt()) return '代理商所属商户进件默认费率'
  }

  if (props.configMode == 'agentSelf') {
    if (mapName == 'mainRateMap') return ''
    if (mapName == 'agentdefMap' && $hasAgentEnt()) return '下级代理商默认费率'
    if (mapName == 'mchapplydefMap') return '商户进件默认费率'
  }

  if (props.configMode == 'agentSubagent') {
    if (mapName == 'mainRateMap') return '代理费率'
  }

  if (props.configMode == 'mgrMch' || props.configMode == 'agentMch') {
    if (mapName == 'mainRateMap') return '商户费率'
  }

  if (props.configMode == 'mgrApplyment' || props.configMode == 'agentApplyment') {
    if (mapName == 'mainRateMap') return '进件费率'
  }

  if (props.configMode == 'mchSelfApp1') {
    if (mapName == 'mainRateMap') return '接口费率'
  }

  return ''
}

// 判断是否显示商户的进件费率的配置
function showMchApplyment(wayCode) {
  // 运营平台： 服务商的配置费率模式 : 判断是否主动开启
  if (props.configMode == 'mgrIsv') {
    return vdata.mainRateMap[wayCode].applymentSupport == 1
  }

  // 其他的需要判断： 是否服务商支持进件。  判断wayCodes中是否支持。
  let obj = vdata.allPaywayMap[wayCode]
  return obj && obj.fixConfig && obj.fixConfig.applymentSupport == 1
}

// 定义响应式数据
const vdata: any = reactive({
  currentIfCode: '', //当前选择的支付通道
  btnLoading: false, // 按钮loading
  jeepayPaywayFeeFlag: false, // 是否显示费率组件（用于重新渲染组件）
  // 费率设置面板的 table 列
  tableColumns: [],
  showSetFeeModal: false, //显示统一设置 弹层
  showSetFeeModalMode: '', //设置类型
  showSetFeeModalValue: 0, //设置的费率
  showSetIsOpenValue: true, //设置统一的开关
  allPaywayList: [], //费率设置的集合
  allPaywayMap: {}, // 费率设置的集合 Map
  //  key  = ifCode
  // mainRateMap 表示多个费率值的设置：   ISVCOST,  AGENT,  MCH,  根据传入的不同进行不同结果的返回。
  mainRateMap: {},
  agentdefMap: {}, // 代理商默认费率
  mchapplydefMap: {}, // 商户进件默认费率
  readonlyIsvCostRateMap: {}, // 服务商底价（用于显示）
  readonlyParentAgentRateMap: {}, // 上级代理商费率（用于显示）
  readonlyParentDefRateRateMap: {}, // 商户的上级的默认费率（用于读取并赋值到input）
  noCheckRuleFlag: false, // 特殊商户， 不进行验证费率规则
  weChatSplitFlag: false, // 微信 是否拆分配置
  aliSplitFlag: false, // 支付宝 是否拆分配置
  UnionPayArray: ['云闪付条码', '银联二维码（主扫）', '云闪付支付'], //银联模式费率
  unPaySelected: [],
  test: '',//测试用
})

// 挂载钩子函数
onMounted(() => {
  vdata.currentIfCode = '' // 默认不选中

  vdata.currentIfCode = props.selectIfCode // 默认接口

  // 重置表格
  resetTableColumns()

  // 重新渲染配置面板
  if (vdata.currentIfCode) {
    reloadRatePanel()
  }
})

/* 根据不同的类型 显示不同的列表数据  */
function resetTableColumns() {
  // 运营平台配置： 代理商费率， 配置 商户费率， 配置进件信息
  if (props.configMode == 'mgrAgent' || props.configMode == 'mgrMch' || props.configMode == 'mgrApplyment') {
    vdata.tableColumns = [
      {key: 'batch', title: '批量选择', width: '50px'},
      {key: 'wayName', title: '支付产品', width: '110px'},
      {key: 'readonlyIsvCostRate', title: '服务商底价'},
      {key: 'readonlyParentAgentRate', title: '上级代理商费率'},
      {key: 'state', title: '是否开通'},
      {key: 'op', title: '配置信息'},
    ]

    if (!$hasAgentEnt()) {
      vdata.tableColumns.splice(3, 1) //删除 上级代理商费率 列
    }

    // 代理商配置商户的费率
  } else if (props.configMode == 'agentMch' || props.configMode == 'agentSubagent' || props.configMode == 'agentApplyment') {
    vdata.tableColumns = [
      {key: 'batch', title: '批量选择', width: '50px'},
      {key: 'wayName', title: '支付产品', width: '110px'},
      {key: 'readonlyParentAgentRate', title: '我的代理费率'},
      {key: 'state', title: '是否开通'},
      {key: 'op', title: '配置信息'},
    ]
  }
  // 代理商配置自己的配置信息
  else if (props.configMode == 'agentSelf') {
    vdata.tableColumns = [
      {key: 'batch', title: '批量选择', width: '50px'},
      {key: 'wayName', title: '支付产品', width: '110px'},
      {key: 'readonlyParentAgentRate', title: '我的代理费率'},
      {key: 'op', title: '配置信息'},
    ]
  }
  // 服务商底价设置
  else if (props.configMode == 'mgrIsv') {
    vdata.tableColumns = [
      {key: 'batch', title: '批量选择', width: '50px'},
      {key: 'wayName', title: '支付产品', width: '110px'},
      {key: 'state', title: '是否开通'},
      {key: 'applymentSupport', title: '进件显示'},
      {key: 'op', title: '配置信息'},
    ]
  }
  // 商户自主进件
  else if (props.configMode == 'mchApplyment') {
    vdata.tableColumns = [
      {key: 'wayName', title: '支付产品', width: '270px'},
      {key: 'op', title: '费率'},
    ]
  } else {
    // 默认使用该方式显示

    vdata.tableColumns = [
      {key: 'batch', title: '批量选择', width: '70px'},
      {key: 'wayName', title: '支付产品', width: '270px'},
      {key: 'state', title: '是否开通', width: '120px'},
      {key: 'op', title: '配置信息'},
    ]
  }
}

// 重置 【费率配置】面板
async function reloadRatePanel() {
  // 数据的重置
  vdata.allPaywayList = []
  vdata.allPaywayMap = {}

  vdata.mainRateMap = {}
  vdata.agentdefMap = {}
  vdata.mchapplydefMap = {}
  vdata.readonlyIsvCostRateMap = {}
  vdata.readonlyParentAgentRateMap = {}
  vdata.readonlyParentDefRateRateMap = {}

  // 当前保存的数据 (DB中的)
  let savedMap: any = {}

  //查询当前已经配置的费率
  await $getRateConfigSavedMapData(props.infoId, props.configMode, vdata.currentIfCode).then((savedMapRes) => {
    savedMap = savedMapRes
  })

  // 查询全部支付产品列表
  await $getRateConfigPayways(props.infoId, props.configMode, vdata.currentIfCode).then((res) => {
    res.records.forEach((item) => {
      item.checked = false // 批量选择， 默认不选中
      vdata.allPaywayList.push(item)
      vdata.allPaywayMap[item.wayCode] = item

      // 初始化数据
      vdata.mainRateMap[item.wayCode] = {
        wayCode: item.wayCode,
        state: 0, // 默认不开通
        applymentSupport: 0, // 进件是否显示
        feeType: 'SINGLE', // 默认单笔费率
        levelList: [], // 阶梯费率数组
      }

      vdata.agentdefMap[item.wayCode] = {
        wayCode: item.wayCode,
        state: 0, // 默认不开通
        applymentSupport: 0, // 进件是否显示
        feeType: 'SINGLE', // 默认单笔费率
        levelList: [], // 阶梯费率数组
      }

      vdata.mchapplydefMap[item.wayCode] = {
        wayCode: item.wayCode,
        state: 0, // 默认不开通
        applymentSupport: 0, // 进件是否显示
        feeType: 'SINGLE', // 默认单笔费率
        levelList: [], // 阶梯费率数组
      }

      vdata.readonlyIsvCostRateMap[item.wayCode] = {
        wayCode: item.wayCode,
        state: 0, // 默认不开通
        applymentSupport: 0, // 进件是否显示
        feeType: 'SINGLE', // 默认单笔费率
        levelList: [], // 阶梯费率数组
      }

      vdata.readonlyParentAgentRateMap[item.wayCode] = {
        wayCode: item.wayCode,
        state: 0, // 默认不开通
        applymentSupport: 0, // 进件是否显示
        feeType: 'SINGLE', // 默认单笔费率
        levelList: [], // 阶梯费率数组
      }

      vdata.readonlyParentDefRateRateMap[item.wayCode] = {
        wayCode: item.wayCode,
        state: 0, // 默认不开通
        applymentSupport: 0, // 进件是否显示
        feeType: 'SINGLE', // 默认单笔费率
        levelList: [], // 阶梯费率数组
      }
    })

    // 服务商底价
    if (savedMap && savedMap.ISVCOST) {
      changeList('mainRateMap', savedMap.ISVCOST)
    }

    // 代理商费率
    if (savedMap && savedMap.AGENTRATE) {
      changeList('mainRateMap', savedMap.AGENTRATE)
    }

    // 商户费率 （此上三个 后台返回接口  三选一 ）
    if (savedMap && savedMap.MCHRATE) {
      changeList('mainRateMap', savedMap.MCHRATE)
    }

    // 代理商默认费率
    if (savedMap && savedMap.AGENTDEF) {
      changeList('agentdefMap', savedMap.AGENTDEF)
    }

    // 商户默认费率
    if (savedMap && savedMap.MCHAPPLYDEF) {
      changeList('mchapplydefMap', savedMap.MCHAPPLYDEF)
    }

    // 服务商底价（用于显示）
    if (savedMap && savedMap.READONLYISVCOST) {
      changeList('readonlyIsvCostRateMap', savedMap.READONLYISVCOST)
    }

    // 上级代理商费率（用于显示）
    if (savedMap && savedMap.READONLYPARENTAGENT) {
      changeList('readonlyParentAgentRateMap', savedMap.READONLYPARENTAGENT)
    }

    // 上级配置的默认费率（用于显示）
    if (savedMap && savedMap.READONLYPARENTDEFRATE) {
      changeList('readonlyParentDefRateRateMap', savedMap.READONLYPARENTDEFRATE)
    }
  })
}

// 保存按钮
function onSubmit() {
  let reqPaywayFeeList = getReqPaywayFeeList()
  if (!reqPaywayFeeList) {
    // 报错
    return false
  }

  // 请求对象
  let reqObject = {
    infoId: props.infoId,
    ifCode: vdata.currentIfCode,
    configMode: props.configMode,
    noCheckRuleFlag: vdata.noCheckRuleFlag ? 1 : 0
  }
  Object.assign(reqObject, reqPaywayFeeList) // 合并对象

  $saveRateConfig(reqObject).then((res) => {
    $infoBox.message.success('保存成功')
  })
}

function batchChecked(wayType, checked) {
  vdata.allPaywayList
      .filter((r) => wayType == 'ALL' || r.wayType == wayType)
      .forEach((element) => {
        element.checked = checked
      })
}

// 点击 批量设置弹层的确认按钮
function handleOkFunc() {
  vdata.allPaywayList
      .filter((r) => r.checked)
      .forEach((element) => {
        let iele = vdata[vdata.showSetFeeModalMode][element.wayCode]
        iele.feeType = 'SINGLE'
        iele.feeRate = vdata.showSetFeeModalValue
        iele.state = vdata.showSetIsOpenValue ? 1 : 0 // 是否开启
      })

  // 关闭弹层
  vdata.showSetFeeModal = false
}

// 显示弹层( mode = 修改的mode )
function showSetFeeModalFunc(mode) {
  if (vdata.allPaywayList.filter((r) => r.checked).length <= 0) {
    return $infoBox.message.error('请选择需要操作的行')
  }

  vdata.showSetFeeModalMode = mode
  vdata.showSetFeeModalValue = 0
  vdata.showSetIsOpenValue = true
  vdata.showSetFeeModal = true
}

// 读取默认费率
function resetDefRate() {
  let vals: any = Object.values(vdata.mainRateMap)

  vals.forEach((element) => {
    element.state = 0
    element.feeType = 'SINGLE'
    delete element.feeRate
    element.levelList = []

    let copyObject = vdata.readonlyParentDefRateRateMap[element.wayCode]
    if (copyObject) {
      Object.assign(element, JSON.parse(JSON.stringify(copyObject)))
    }
  })
}

// 更改当前可视化的值 （此时已经查询到了全部支付方式了）
// savedMap : 当前DB保存的数据
function changeList(mode, savedMap) {
  // 全部支付方式
  let valList: any = Object.values(vdata[mode])

  valList.forEach((element) => {
    // 数据初始化操作
    element.feeType = 'SINGLE'
    delete element.feeRate
    delete element.minFee
    delete element.maxFee
    element.levelList = []

    let record = savedMap[element.wayCode] || {}

    //复制到数组中
    Object.assign(element, record)
    element.checked = false

    element.state = savedMap[element.wayCode] ? 1 : 0 //默认开通

    // 明确关闭
    if (savedMap[element.wayCode] && savedMap[element.wayCode].state === 0) {
      element.state = 0
    }

    // 转换费率和金额格式

    if (typeof element.feeRate == 'number') {
      element.feeRate = Number.parseFloat((element.feeRate * 100).toFixed(4))
    }

    if (typeof element.maxFee == 'number') {
      element.maxFee = Number.parseFloat((element.maxFee / 100).toFixed(2))
    }

    if (typeof element.minFee == 'number') {
      element.minFee = Number.parseFloat((element.minFee / 100).toFixed(2))
    }

    if (element.levelList) {
      element.levelList.forEach((levelItem) => {
        if (typeof levelItem.feeRate == 'number') {
          levelItem.feeRate = Number.parseFloat((levelItem.feeRate * 100).toFixed(4))
        }

        if (typeof levelItem.maxFee == 'number') {
          levelItem.maxFee = Number.parseFloat((levelItem.maxFee / 100).toFixed(2))
        }

        if (typeof levelItem.minFee == 'number') {
          levelItem.minFee = Number.parseFloat((levelItem.minFee / 100).toFixed(2))
        }
      })
    }

    // 贷记卡的金额回显
    if (element.creditCardPaywayFee) {
      if (typeof element.creditCardPaywayFee.feeRate == 'number') {
        element.creditCardPaywayFee.feeRate = Number.parseFloat((element.creditCardPaywayFee.feeRate * 100).toFixed(4))
      }

      if (typeof element.creditCardPaywayFee.maxFee == 'number') {
        element.creditCardPaywayFee.maxFee = Number.parseFloat((element.creditCardPaywayFee.maxFee / 100).toFixed(2))
      }

      if (typeof element.creditCardPaywayFee.minFee == 'number') {
        element.creditCardPaywayFee.minFee = Number.parseFloat((element.creditCardPaywayFee.minFee / 100).toFixed(2))
      }

      if (element.creditCardPaywayFee.levelList) {
        element.creditCardPaywayFee.levelList.forEach((levelItem) => {
          if (typeof levelItem.feeRate == 'number') {
            levelItem.feeRate = Number.parseFloat((levelItem.feeRate * 100).toFixed(4))
          }

          if (typeof levelItem.maxFee == 'number') {
            levelItem.maxFee = Number.parseFloat((levelItem.maxFee / 100).toFixed(2))
          }

          if (typeof levelItem.minFee == 'number') {
            levelItem.minFee = Number.parseFloat((levelItem.minFee / 100).toFixed(2))
          }
        })
      }
    }
  })
}

// 获取请求数据的对象格式 (包含了验证规则)
// 返回格式： { ISVCOST: []   AGENTDEF:[]   MCHAPPLYDEF:[] }
function getReqPaywayFeeList() {
  let mainRateList = getReqPaywayFeeListByList(Object.values(vdata.mainRateMap))

  if (typeof mainRateList != 'object') {
    return false
  }

  let agentdefList = getReqPaywayFeeListByList(Object.values(vdata.agentdefMap))
  if (typeof agentdefList != 'object') {
    return false
  }

  let mchapplydefList = getReqPaywayFeeListByList(Object.values(vdata.mchapplydefMap), true)
  if (typeof mchapplydefList != 'object') {
    return false
  }

  if (props.configMode == 'mgrIsv') {
    return {ISVCOST: mainRateList, AGENTDEF: agentdefList, MCHAPPLYDEF: mchapplydefList}
  } else if (props.configMode == 'mgrAgent') {
    return {AGENTRATE: mainRateList, AGENTDEF: agentdefList, MCHAPPLYDEF: mchapplydefList}
  } else if (
      props.configMode == 'mgrMch' ||
      props.configMode == 'agentMch' ||
      props.configMode == 'mgrApplyment' ||
      props.configMode == 'mchApplyment' ||
      props.configMode == 'agentApplyment'
  ) {
    return {MCHRATE: mainRateList}
  } else if (props.configMode == 'agentSubagent') {
    return {AGENTRATE: mainRateList}
  } else if (props.configMode == 'agentSelf') {
    return {AGENTDEF: agentdefList, MCHAPPLYDEF: mchapplydefList}
  } else if (props.configMode == 'mchSelfApp1') {
    // 普通商户的设置
    return {MCHRATE: mainRateList}
  }
}

// element(原始数据) -->  obj（新对象的数据）
// 当前一切正常，返回 true
function levelFeeElementConvertObj(obj, element) {
  if (typeof element.minFee != 'number') {
    return $infoBox.message.error('阶梯费率请填入保底费用')
  }
  if (typeof element.maxFee != 'number') {
    return $infoBox.message.error('阶梯费率请填入封顶费用')
  }

  obj.minFee = Number.parseInt(element.minFee * 100 + '')
  obj.maxFee = Number.parseInt(element.maxFee * 100 + '')

  let levelList: any = []
  for (let y = 0; y < element.levelList.length; y++) {
    let levelItem = element.levelList[y]

    let levelCopy: any = {}

    if (typeof levelItem.feeRate != 'number' || levelItem.feeRate <= 0) {
      return $infoBox.message.error('请录入阶梯费率')
    }

    if (typeof levelItem.minFee != 'number') {
      return $infoBox.message.error('阶梯费率请填入金额区间值')
    }
    if (typeof levelItem.maxFee != 'number') {
      return $infoBox.message.error('阶梯费率请填入金额区间值')
    }

    levelCopy.feeRate = Number.parseFloat((levelItem.feeRate / 100).toFixed(4))
    levelCopy.minFee = Number.parseInt(levelItem.minFee * 100 + '')
    levelCopy.maxFee = Number.parseInt(levelItem.maxFee * 100 + '')
    levelList.push(levelCopy)
  }

  obj.levelList = levelList
  if (obj.levelList.length <= 0) {
    return $infoBox.message.error('阶梯费率请至少包含一个价格区间')
  }

  return true
}

// 通用获取费率配置信息
function getReqPaywayFeeListByList(list, filterApplymentSupport = false) {
  let result: any = []

  // 所有开通
  // 1. 添加 : vdata.allPaywayMap[r.wayCode]  仅判断仅获取支持的接口（避免 服务商设置了， 又关闭掉了这种情况。    2. 此逻辑可删除， 因为初始化mainRateList是来自支持的接口的。  )
  let supportArray = list.filter((r) => r.state == 1)

  for (let index = 0; index < supportArray.length; index++) {
    const element = supportArray[index]

    // 只包含进件的数据 && 当前数据行不支持进件
    if (filterApplymentSupport && !showMchApplyment(element.wayCode)) {
      continue
    }

    let obj: any = {}

    obj.wayCode = element.wayCode
    obj.feeType = element.feeType
    obj.state = element.state
    obj.applymentSupport = element.applymentSupport

    // 以下为： state = true的情况

    //单笔费率值
    if (element.feeType == 'SINGLE') {
      if (typeof element.feeRate != 'number' || element.feeRate < 0) {
        return $infoBox.message.error('费率值不可小于0')
      }
      obj.feeRate = Number.parseFloat((element.feeRate / 100).toFixed(4))
    } else {
      // 阶梯费率

      let convertResult = levelFeeElementConvertObj(obj, element)
      if (!(convertResult === true)) {
        // 出现异常
        return false
      }

      // 包含 信用卡的配置项
      if (element.creditCardPaywayFee) {
        let creditCardPaywayFeeObj = {}
        let convertResult2 = levelFeeElementConvertObj(creditCardPaywayFeeObj, element.creditCardPaywayFee)
        if (!(convertResult2 === true)) {
          // 出现异常
          return false
        }

        obj.creditCardPaywayFee = creditCardPaywayFeeObj
      }
    }

    result.push(obj)
  }

  return result
}

/** 获取到： 商户的费率值 （一般用作进件时的设置费率值）  */
/** 还有， 盛付通，申请费率调整时需要  */
function getReqMchRatePaywayFeeList() {
  let reqPaywayFeeList = getReqPaywayFeeList()

  if (!reqPaywayFeeList) {
    // 报错
    return false
  }

  return reqPaywayFeeList['MCHRATE']
}

// 判断是否开通了某个支付产品
function hasApplymentWaycode(wayCode) {
  return vdata.mainRateMap[wayCode] && vdata.mainRateMap[wayCode].state == 1
}

// 读取默认费率
function setParentRateBtnFunc(wayCode) {
  // 判断上级的费率是否可用
  let checkFunc = (rate) => {
    if (!rate) {
      return null
    }

    // 单笔
    if (rate.feeType == 'SINGLE' && typeof rate.feeRate != 'undefined') {
      return rate
    }

    // 阶梯
    if (rate.feeType == 'LEVEL' && rate.levelList && rate.levelList.length > 0 && rate.levelList[0].feeRate) {
      return rate
    }

    return null
  }

  let rate = checkFunc(vdata.readonlyParentDefRateRateMap[wayCode]) || checkFunc(vdata.readonlyParentAgentRateMap[wayCode]) || checkFunc(vdata.readonlyIsvCostRateMap[wayCode])

  if (rate) {
    // 只取到基础费率数据
    Object.assign(
        vdata.mainRateMap[wayCode],
        JSON.parse(
            JSON.stringify({
              feeType: rate.feeType,
              feeRate: rate.feeRate,
              levelList: rate.levelList,
              maxFee: rate.maxFee,
              minFee: rate.minFee,
              creditCardPaywayFee: rate.creditCardPaywayFee,
            })
        )
    )

    return false
  }
}

function isShowsetParentRateBtn() {
  // 设置服务商底价 , 代理商自己的页面, 普通商户 , 商户的进件页面 不需要显示
  if (props.configMode == 'mgrIsv' || props.configMode == 'agentSelf' || props.configMode == 'mchSelfApp1' || props.configMode == 'mchApplyment') {
    return false
  }

  return true
}

//测试检查数据用
const save = () => {
  console.log(vdata.test)
}
defineExpose({getReqMchRatePaywayFeeList, hasApplymentWaycode})
</script>

<style lang="less" scoped>
.weChat-pay-list {
  display: flex;
  align-items: center;

  .w-pay-title {
    margin-bottom: 20px;
  }

  .w-pay-item:nth-child(n+2) {
    margin-left: 70px;
  }
}

.unPay-title-list {
  display: flex;
  margin-bottom: 20px;

  .unPay-title-item {
    width: 300px;
    font-size: 14px;
    font-weight: 700;
  }

  .unPay-title-item:nth-child(n + 2) {
    margin-left: 70px;
  }
}

.unPay-input-list {
  display: flex;
  margin-bottom: 20px;

  .unPay-input-item {
    width: 300px;
  }

  .unPay-input-item :deep .ant-input-group-wrapper:nth-child(1) {
    margin-bottom: 20px;
  }

  .unPay-input-item:nth-child(n + 2) {
    margin-left: 70px;
  }
}

.save-but-wrapper {
  display: flex;
  justify-content: center;
  margin-top: 90px;

  .save-but-item {
    width: 160px;
  }
}
</style>
